Curso I – SISSA

Introducción a R - Parte 2

Objetivo y contenidos

Objetivo y contenidos

Objetivo: generar el conocimiento básico para importar, modificar, escribir y graficar datos, así como escribir ciclos utilizando el Proyecto R para computación estadística.

Contenido:

  • Importación y exportación de datos
  • Operadores relacionales
  • Procesos iterativos
  • Gráficos básicos con R

Importación y exportación de datos

Importación de datos

Para importar datos a R podemos utilizar la función read.table, la cual devuelve un objeto data.frame.

read.table(file, header = FALSE, sep = "",
           dec = ".", row.names, col.names, na.strings = "NA",
           skip = 0, stringsAsFactors = FALSE, ...)

file: el nombre del archivo desde el cual se leerán los datos.

header: un valor lógico que indica si el archivo contiene el nombre de las variables en la primera línea.

sep: el caracter separador de campos. Los valores en cada línea del archivo están separados por este caracter.

Importación de datos

read.table(file, header = FALSE, sep = "",
           dec = ".", row.names, col.names, na.strings = "NA",
           skip = 0, stringsAsFactors = FALSE, ...)

dec: el caracter utilizado en el archivo para los puntos decimales.

na.strings: un vector de caracteres que se interpretarán como valores NA.

stringsAsFactors: [Lógico] ¿Deben convertirse los vectores de caracteres en factores?

Recuerda que si no agregamos alguno de estos argumentos, se usará la configuración predeterminada.

Importación de datos

Creemos una tabla en Excel

Importación de datos

Guarde la tabla como un archivo csv:

Importación de datos

Usaremos la ruta del archivo en la función read.table.

data.path <- "C:/Usuarios/Ejemplo/Data.csv"
p_eta_table <- read.table(data.path, header = TRUE, sep = ",")
print(p_eta_table)
##   Year Precipitation Evapotranspiration
## 1 2010          1250               1050
## 2 2011          1952               1748
## 3 2012          1328               1047
## 4 2013          1459               1284
## 5 2014          1642               1421
## 6 2015          1743               1484
## 7 2016          1238                998
## 8 2017          1432               1259

Importación de datos

Podemos utilizar también la función read.csv:

p_eta_table <- read.csv(data.path)
print(p_eta_table)
##   Year Precipitation Evapotranspiration
## 1 2010          1250               1050
## 2 2011          1952               1748
## 3 2012          1328               1047
## 4 2013          1459               1284
## 5 2014          1642               1421
## 6 2015          1743               1484
## 7 2016          1238                998
## 8 2017          1432               1259

Leer Tablas, CSV y CSV2 - Configuraciones predeterminadas

Las funciones read.table, read.csv y read.csv2 se pueden utilizar para importar datos. Tenga en cuenta que las funciones read.csv y read.csv2 provienen de read.table pero tienen diferentes configuraciones por defecto.

             read.table     header = FALSE, sep = " "

             read.csv       header = TRUE, sep = ","

             read.csv2      header = TRUE, sep = ";"

Trabajando con data frames

dim: devuelve el número de filas y columnas (es decir, las dimensiones) del objeto.

dim(p_eta_table)
## [1] 8 3

Ahora podemos agregar una nueva columna al data frame existente. Como ejemplo, vamos a calcular los valores de precipitación menos evapotranspiración:

p_eta_table$P_minus_ETa <- p_eta_table$Precipitation - p_eta_table$Evapotranspiration

Trabajando con data frames

print(p_eta_table)
##   Year Precipitation Evapotranspiration P_minus_ETa
## 1 2010          1250               1050         200
## 2 2011          1952               1748         204
## 3 2012          1328               1047         281
## 4 2013          1459               1284         175
## 5 2014          1642               1421         221
## 6 2015          1743               1484         259
## 7 2016          1238                998         240
## 8 2017          1432               1259         173

Trabajando con data frames

El acceso a los datos es el mismo para las matrices y los data frames. Por ejemplo, para extraer el valor ubicado en la segunda fila y la cuarta columna:

p_eta_table[2, 4]
## [1] 204

O:

p_eta_table$P_minus_ETa[2]
## [1] 204

Trabajando con data frames

También podemos obtener los tres primeros valores de la tercera fila.

p_eta_table[3, 1:3]
##   Year Precipitation Evapotranspiration
## 3 2012          1328               1047

O hacer un subconjunto del data frame.

p_eta_table[c(7, 2, 4), ]
##   Year Precipitation Evapotranspiration P_minus_ETa
## 7 2016          1238                998         240
## 2 2011          1952               1748         204
## 4 2013          1459               1284         175

Exportar datos

Para exportar datos, podemos utilizar la función write.table, que exporta el objeto utilizado a un directorio específico.

write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            na = "NA", dec = ".", row.names = TRUE, ...)

x: el objeto a escribir (una matriz o un data frame).

file: la ruta de archivo donde queremos guardar el archivo (incluyendo el nombre y extensión del archivo).

append: [Lógico] Si es TRUE, la salida se agrega al archivo existente. Si es FALSE, cualquier archivo existente con el mismo nombre se destruye.

Exportar datos

write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            na = "NA", dec = ".", row.names = TRUE, ...)

quote: [Lógico] si es TRUE, cualquier columna de caracteres o factores estará rodeada de comillas dobles.

sep: el separador de campo. Los valores dentro de cada fila x están separados por este caracter.

na: el caracter a utilizar para los valores faltantes (NA) en los datos.

Exportar datos

write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
            na = "NA", dec = ".", row.names = TRUE, ...)

dec: el caracter a utilizar para los puntos decimales en columnas numéricas o complejas: debe ser un solo caracter.

row.names and col.names: [Lógico] Indica si los nombres se escribirán junto con x.

Exportar datos

Ahora, guardaremos la tabla que hemos editado.

write.table(p_eta_table, paste0(dirname(data.path), "/table_modified.csv"),
row.names = FALSE, sep = ",")

Ahora, puedes ir a la carpeta correspondiente y comprobar si el archivo se ha escrito.

Exportar datos

Además, podemos guardar un único objeto de R en una conexión y posteriormente restaurarlo usando las funciones saveRDS y readRDS.

saveRDS(p_eta_table, paste0(dirname(data.path), "/table_modified.rds"))
x <- readRDS(p_eta_table, paste0(dirname(data.path), "/table_modified.rds"))

Unir tablas

Podemos utilizar la función rbind para combinar las filas de dos tablas separadas y formar una sola. Para este ejemplo, cargaremos tablas con las ciudades más pobladas de España e Italia.

spain.pop <- read.csv("...add file path…/Cities/Spain.csv", header = TRUE)
italy.pop <- read.csv("...add file path…/Cities/Italy.csv", header = TRUE)
##          City Population
## 1      Madrid    3334730
## 2   Barcelona    1664182
## 3 Val\xe8ncia     800215
## 4     Sevilla     691395
## 5    Zaragoza     681877
## 6   M\xe1laga     578460

Unir tablas

Primero, agreguemos información sobre el país a la tabla, para que la tabla combinada incluya el país para cada entrada.

spain.pop$Country <- rep("Spain", times = nrow(spain.pop))
italy.pop$Country <- rep("Italy", times = nrow(italy.pop))
print(spain.pop)
##                          City Population Country
## 1                      Madrid    3334730   Spain
## 2                   Barcelona    1664182   Spain
## 3                 Val\xe8ncia     800215   Spain
## 4                     Sevilla     691395   Spain
## 5                    Zaragoza     681877   Spain
## 6                   M\xe1laga     578460   Spain
## 7                      Murcia     459403   Spain
## 8                       Palma     422587   Spain
## 9  Las Palmas de Gran Canaria     381223   Spain
## 10                     Bilbao     350184   Spain
print(italy.pop)
##      City Population Country
## 1    Roma    2808293   Italy
## 2  Milano    1406242   Italy
## 3  Napoli     948850   Italy
## 4  Torino     857910   Italy
## 5 Palermo     647422   Italy
## 6  Genova     565752   Italy
## 7 Bologna     395416   Italy
## 8 Firenze     366927   Italy
## 9    Bari     315284   Italy

Unir tablas

Ahora podemos usar la función rbind para unir las tablas.

pop.table <- rbind(spain.pop, italy.pop)

De manera similar, la función cbind combinará objetos por columnas.

Operadores relacionales

Operadores relacionales

R utiliza los siguientes operadores relacionales:

<     menor que
>     mayor que
<=    menor o igual que
>=    mayor o igual que
==    igual a
!=    no igual a

Por ejemplo:

5 > 4
## [1] TRUE
2 + 2 == 5
## [1] FALSE

Procesos iterativos

Procesos iterativos

Los ciclos son muy importantes porque nos permiten hacer lo siguiente:

  • Ejecutar un cierto código solo si se cumple una condición (if)

  • Ejecutar el mismo proceso un número especificado de veces (for)

    • Un ejemplo común es ejecutar el mismo código para cada paso de tiempo
  • Continuar ejecutando un proceso hasta que se cumpla una condición (while)

Procesos iterativos

Declaraciones if

R puede realizar ejecuciones condicionales de la forma:

if (condicional)  proceso 1 else proceso 2

La declaración condicional debe evaluar un único valor lógico. El proceso 1 se ejecutará si se cumple la condición, mientras que el proceso 2 se ejecutará cuando no se cumpla la condición.

Declaraciones if

Por ejemplo:

if(5 > 4) print("Sí") else print("No")
## [1] "Sí"

O:

if(5 > 4)
  print("Sí") else
    print("No")
## [1] "Sí"

Declaraciones if

Si los procesos contenidos en la condición requieren varias líneas, deben escribirse dentro de llaves.

if(5 > 4){
  x <- 5
  y <- x * 10
  print(y)
} else {
  x <- 2
  y <- x * 5 
  print(y)
  
}
## [1] 50

Declaraciones if

Ten en cuenta que la declaración else no siempre es necesaria:

x <- 5
if(x > 4){
  y <- x *10
  print(y)
}
## [1] 50

Declaraciones if

Un ejemplo de una cláusula else dentro de un ciclo if es el siguiente:

input.value <- 32

if(input.value > 0){
  result <- log(input.value)
  paste("El logaritmo de", input.value, "es igual a", result)
} else {
  paste("El valor de entrada es negativo, por lo tanto no se puede calcular el logaritmo")
}
## [1] "El logaritmo de 32 es igual a 3.46573590279973"

Declaraciones if

A veces, queremos ejecutar un ciclo si se cumple cualquiera de un conjunto de condiciones.

day <- "Lunes"

if(day == "Sábado" | day == "Domingo"){
  response <- paste("No hay alarma pero hoy hay asado!")
} else {
  alarm.time <- "7am"
  response <- paste("My alarm will be set for", alarm.time)
}

print(response)
## [1] "My alarm will be set for 7am"

Ciclos for

El ciclo for tiene la forma:

for(variable in vector) proceso

La variable se iterará durante el ciclo for tomando cada uno de los valores definidos en el vector. El proceso se aplicará en cada iteración. Por ejemplo:

for(i in 1:5) print(i)
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5

Ciclos for

Al igual que con la declaración if, si el proceso tiene más de una línea de código, debe estar rodeado por llaves.

for(i in 1:5){
  x <- i^2
  y <- x * 5
  print(y)
}
## [1] 5
## [1] 20
## [1] 45
## [1] 80
## [1] 125

Ciclos for

Si escribes un ciclo dentro de otro ciclo, nos referimos a esto como un ciclo anidado,

for(i in 1:10){
  for (j in 1:5){
    a <- i + j
    cat(i, "más", j, "es igual a", a, "\n")
}
  cat("------------------------ \n")
}

Ciclos for

Podemos utilizar un ciclo for en un análisis de series de tiempo espaciales.

Ciclos while

El ciclo while tiene la forma:

while(condición) proceso

La condición se evaluará, si es verdadera se ejecutará el proceso. Cuando la condición ya no se cumpla, el ciclo while se detendrá.

Ciclos while

Por ejemplo:

delta <- 0.75
x     <- 1

while(delta < x){
  x <- x - 0.05
  print(x)
}
## [1] 0.95
## [1] 0.9
## [1] 0.85
## [1] 0.8
## [1] 0.75

Gráficos básicos con R

Gráficos básicos con R

La función plot es una función genérica. Esto significa que el tipo de gráfico producido depende del tipo o clase del primer argumento.

plot(x, y, type, main, sub, xlab, ylab)

x: las coordenadas de los puntos en el gráfico (eje x) y: las coordenadas de los puntos en el gráfico (eje y) main: un título para el gráfico sub: un subtítulo para el gráfico xlab e ylab: títulos para los ejes x e y

Nota: y se puede omitir si x tiene la estructura adecuada (por ejemplo, para un archivo ráster)

Gráficos básicos con R

type: qué tipo de gráfico debe dibujarse. Los posibles tipos son:

  1. “p” para puntos
  2. “b” para ambos (puntos y líneas)
  3. “l” para líneas
  4. “c” para la parte de líneas sola de “b”
  5. “o” para sobreponer un plot
  6. “s” para escalones
  7. “n” no dibujar
  8. “h” para histograma
  9. “S” para otros escalones

Gráficos básicos con R

Para mostrar el primer conjunto de ejemplos de gráficos, leeremos un archivo csv con datos del Banco Mundial para el rendimiento promedio anual de los cultivos de cereales tanto para el mundo como para Alemania.

crop.yield <- read.csv("...tu propio path.../Data/Cereal_Yield.csv")
print(crop.yield)

Cuando tenemos muchos registros de datos almacenados en un objeto, podemos usar las funciones head y tail para ver los seis primeros y los últimos seis registros, respectivamente.

Nota: los valores presentados están en kg/ha.

Gráficos básicos con R

head(crop.yield)
##   Year Global_Cereal_Yield German_Cereal_Yield
## 1 1961            1431.537              2417.4
## 2 1962            1523.116              2962.2
## 3 1963            1589.004              2925.2
## 4 1964            1589.813              3120.8
## 5 1965            1639.062              2852.2
## 6 1966            1680.538              2878.0
tail(crop.yield)
##    Year Global_Cereal_Yield German_Cereal_Yield
## 52 2012            3619.562              6964.9
## 53 2013            3824.374              7318.0
## 54 2014            3892.360              8050.3
## 55 2015            3938.770              7497.8
## 56 2016            3967.029              7182.1
## 57 2017            4074.176              7269.9

Gráficos de líneas

Comencemos con un gráfico de líneas para los valores globales.

plot(crop.yield$Year, crop.yield$Global_Cereal_Yield, type = "l")

Gráficos de líneas

Nota: obtendremos el mismo resultado seleccionando las posiciones de cada columna en lugar de los nombres: es decir, plot(crop.yield[,1], crop.yield[,2], type = “l”).

Gráficos de líneas

Ahora, volveremos a crear el gráfico de una manera más personalizada (título del gráfico, títulos de los ejes, valores mínimos y máximos definidos por el usuario).

plot(crop.yield$Year, crop.yield$Global_Cereal_Yield, type = "l",
main = "Producción media de cereales", xlab = "Año",
ylab = "Producción media (kg/ha)", ylim = c(0, 10000))

Gráficos de líneas

La función lines se utiliza para agregar otra línea a un gráfico existente. La función legend se utiliza para agregar una leyenda al gráfico.

lines(crop.yield$Year, crop.yield$German_Cereal_Yield, col = "red")
legend("topleft", c("Global", "Alemania"), lty = 1, col = c("black", "red"))

Adding Points to a Graph

La función points se utiliza para agregar puntos a un gráfico existente. pch selecciona el caracter de trazado y col el color de trazado.

points(x = c(1990, 2000, 2010), y = c(3000, 4000, 6000),
        pch = 20, col = c("red", "blue", "black"))

Gráficos de dispersión

También podemos representar la información usando un gráfico de dispersión.

plot(crop.yield$Year, crop.yield$Global_Cereal_Yield, type = "p")

Gráficos de dispersión

Nota: la opción de gráfico predeterminada es con puntos. Por lo tanto, si no especificamos el tipo, obtendremos el mismo resultado.

Histogramas

Un histograma es una representación gráfica de la distribución de datos numéricos.

  • Es una estimación de la distribución de probabilidad de una variable continua.

Ejemplo: los valores diarios de temperatura (en °C) para abril en una ciudad particular son:

Histogramas

temp <- c(13, 14, 14, 15, 17, 14, 12, 14, 16, 
          25, 21, 19, 20, 20, 23, 23, 23, 21, 
          16, 17, 14, 14, 15, 16, 23, 16, 17, 
          27, 24, 21)

Histogramas

La función hist genera un histograma.

hist(temp)

Histogramas

De nuevo, podemos personalizar el histograma.

hist(temp, main = "Histogram of temperature in April", xlab = "Temp [°C]",
border = "blue", col = "cyan", breaks = 8)

Histogramas

Recuerda pensar cuidadosamente cómo graficar y analizar tus datos.

  • Al mirar el ejemplo anterior, si graficamos los datos con 5 cortes y con 8 cortes:

(diagramas de caja y bigotes)

La función boxplot produce un boxplot para valores (agrupados).

boxplot(temp)

Boxplots

Ahora importemos los valores diarios para la temperatura máxima en una ciudad piloto.

daily.temp <- read.csv("C:/Usuario/Data/Daily_Temp.csv")

Boxplots

print(daily.temp)
##     Jan  Feb  Mar  Apr  May  Jun  Jul  Aug  Sep  Oct  Nov  Dec
## 1  15.0 17.8 20.6 32.2 27.2 22.8 32.2 31.1 30.0 30.6 24.4 17.2
## 2  15.6 16.7 18.3 22.8 29.4 22.8 32.2 33.9 29.4 31.1 28.9 17.2
## 3  12.8 16.1 20.0 21.1 35.0 26.1 32.2 32.8 28.3 27.2 25.6 16.7
## 4  17.8 18.9 23.3 27.2 32.8 23.3 31.7 32.8 31.7 19.4 15.6 17.2
## 5  21.7 21.7 27.8 24.4 30.0 25.6 33.9 30.0 27.8 17.2 17.8 17.8
## 6  21.1 25.0 20.0 19.4 25.6 22.8 34.4 29.4 36.7 18.9 14.4 18.3
## 7  16.1 26.7 15.0 16.7 22.2 23.3 32.8 29.4 37.8 22.8 17.8 19.4
## 8  15.0 17.2 21.1 14.4 20.0 22.2 31.1 29.4 37.8 27.2 21.1 19.4
## 9  15.0 21.1 28.9 14.4 17.2 21.1 30.6 27.2 27.8 28.9 25.6 21.1
## 10 17.8 20.6 26.7 20.0 21.7 21.1 29.4 26.7 23.9 28.3 23.9 21.7
## 11 21.1 23.3 23.9 22.2 22.8 23.3 27.8 26.7 26.7 28.3 25.0 15.6
## 12 22.8 26.7 19.4 21.7 25.6 22.8 25.0 26.7 29.4 38.3 17.8 11.7
## 13 23.9 23.9 21.1 18.9 24.4 25.6 25.0 25.6 27.8 37.2 22.8 12.2
## 14 27.2 19.4 25.0 23.3 20.0 27.2 23.3 28.3 25.6 31.1 21.7 16.1
## 15 26.7 19.4 25.6 30.0 17.8 27.2 24.4 28.9 25.6 27.2 20.6 15.0
## 16 27.2 16.1 24.4 33.3 18.9 25.6 25.0 30.0 22.2 26.1 21.7 17.8
## 17 28.9 16.1 22.8 27.8 17.2 23.9 26.7 31.1 24.4 29.4 21.7 19.4
## 18 28.9 18.9 20.6 18.3 17.2 25.0 28.9 30.0 27.2 26.7 15.6 14.4
## 19 20.6 14.4 17.2 20.6 20.6 24.4 30.6 27.2 27.2 22.8 16.1 14.4
## 20 24.4 13.9 15.6 20.0 22.2 27.8 31.1 27.8 27.8 23.9 16.1 17.8
## 21 25.0 16.1 15.6 20.0 25.6 32.2 30.6 26.7 28.3 22.8 16.1 18.3
## 22 22.2 16.1 16.7 20.6 21.1 30.6 27.8 29.4 30.6 28.9 19.4 18.9
## 23 24.4 15.6 19.4 20.6 20.0 29.4 28.9 31.1 28.3 28.9 17.8 20.0
## 24 23.9 15.6 16.7 20.0 22.8 27.8 28.3 31.7 25.0 21.7 16.7 22.8
## 25 23.3 15.0 16.7 22.2 26.1 29.4 33.3 33.3 23.3 20.0 18.9 23.3
## 26 25.0 11.7 15.6 22.8 23.3 29.4 30.0 35.0 26.7 21.1 27.8 23.3
## 27 25.0 13.9 18.9 28.3 26.7 31.7 26.1 36.1 30.0 24.4 28.9 21.1
## 28 24.4 18.9 18.3 28.3 22.2 28.3 27.8 33.3 27.8 27.2 27.2 26.1
## 29 20.6   NA 23.3 22.8 17.8 26.7 34.4 35.0 27.8 28.3 26.7 25.6
## 30 15.0   NA 29.4 26.7 26.1 28.9 36.7 32.2 31.1 31.1 23.3 22.8
## 31 17.2   NA 32.2   NA 26.1   NA 29.4 30.0   NA 28.9   NA 25.0

Boxplots

Para generar un boxplot con los datos:

boxplot(daily.temp, main = "Temperatura máxima diaria en la ciudad X en 2011",
col = "cyan", ylab = "Temp máx (C)")

Gráficos de barras

La función barplot crea un gráfico de barras con barras verticales u horizontales.

barplot(crop.yield$Global_Cereal_Yield)

Gráficos de barras

Personalicemos el gráfico de barras.

barplot(crop.yield$Global_Cereal_Yield, main = "Rendimiento global de cereales",
sub = "Datos del Banco Mundial", xlab = " Año", ylab = "Rendimiento (kg/ha)", names.arg = crop.yield$Year)

Gráficos de barras

Algunas otras opciones para cambiar cómo se presenta la información en un gráfico de barras:

  • col para agregar color al gráfico

  • horiz para crear un gráfico de barras horizontal (configurado en TRUE)

x <- c(8, 5, 10)
barplot(x, main = "Ejemplo de gráfico de barras horizontal",
names.arg = c("A", "B", "C"), horiz = TRUE,
ylab = "número", col = c("red", "blue", "yellow"))

Gráficos de barras

Gráficos de pastel

La función pie dibuja un gráfico de pastel.

slices  <- c(10, 12, 4, 16, 8)
country <- c("Mexico", "Argentina", "Chile", "Uruguay", "Paraguay")
pie(slices, labels = country)

Gráficos de pastel

Más personalizado:

pie(slices, labels = country, main = "Pie chart of countries",
col = rainbow(length(slices)))

¡Gracias por su atención!